package com.qf.exam01.controller;

import com.qf.exam01.service.GetFile;
import com.qf.exam01.utils.IPUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;
import java.util.*;

@RestController
@RequestMapping("/ip")
@EnableConfigurationProperties(GetFile.class)
public class IPContoller {

   @Autowired
    GetFile file01;



    // 存储最近一次生成的 IP 地址列表
    private static List<String> lastGeneratedIps;

    /**
     * 该接口生成指定数量的IP地址，并写入文本文件中
     * 文本文件的路径在yml文件中配置，key为 qfsy.ip.file01
     * @return
     */
    @GetMapping("/generate/{number}")
    public List<String> generateIP(@PathVariable("number") Integer number){


        //创建一个 List 存储生成的 IP 地址
        List<String> ips = new ArrayList<>(number);
        // 随机生成指定数量的 IP 地址
        for (int i = 0; i < number; i++) {
            ips.add(String.valueOf(IPUtils.randomIP(192,168,20)));
        }
        // 将最近一次生成的 IP 地址存储到 lastGeneratedIps 变量中
        lastGeneratedIps = ips;
        try (FileWriter fw = new FileWriter(file01.getFile01());
             BufferedWriter bw = new BufferedWriter(fw)) {
            for (String ip : ips) {
                bw.write(ip);
                bw.newLine();
            }
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ips;
    }

    /**
     * 查询上次生成的随机IP地址
     * @return
     */
    @GetMapping("/query")
    public List<String> queryLast(){

        if (lastGeneratedIps == null || lastGeneratedIps.isEmpty()) {
            return  Collections.emptyList();
        }
        return lastGeneratedIps;
    }



    /**
     * IP地址去重和统计
     * 1. 把不重复的IP地址写入一个新的文本文件中，文件配置在yml中，key为 qfsy.ip.file01
     * 2. 并在接口中返回
     * - 不重复的IP
     * - IP出现的次数
     * - 重复次数最多的5个IP
     * @return
     */
    @GetMapping("/s")
    public HashMap statistic(){
        // 存储 IP 地址和重复的次数的映射关系
        Map<String, Integer> ipToFreqMap = new HashMap<>();
        // 存储不重复的 IP 地址
        Set<String> uniqueIps = new HashSet<>();
        // 存储出现次数最多的 5 个 IP 地址以及对应的出现次数
        PriorityQueue<Map.Entry<String, Integer>> top5 =
                new PriorityQueue<>(Comparator.comparingInt(Map.Entry::getValue));
        // 解析 IP 地址文件并计算每个 IP 地址的频数
        try (FileReader fr = new FileReader(file01.getFile01());
             BufferedReader br = new BufferedReader(fr)) {
            String line;
            while ((line = br.readLine()) != null) {
                String ip = line.trim();
                uniqueIps.add(ip);
                int freq = ipToFreqMap.getOrDefault(ip, 0);
                ipToFreqMap.put(ip, freq + 1);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 将 IP 地址频数映射关系转换为出现次数最多的前 5 个 IP
        for (Map.Entry<String, Integer> entry : ipToFreqMap.entrySet()) {
            if (top5.size() < 5 || top5.peek().getValue() < entry.getValue()) {
                top5.offer(entry);
                if (top5.size() > 5) {
                    top5.poll();
                }
            }
        }
        // 将不重复的 IP 地址写入新的文本文件
        try (FileWriter fw = new FileWriter(file01.getFile02());
             BufferedWriter bw = new BufferedWriter(fw)) {
            for (String ip : uniqueIps) {
                bw.write(ip);
                bw.newLine();
            }
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 构造返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("不重复的ip", new ArrayList<>(uniqueIps));
        result.put("次数统计", ipToFreqMap);
        List<Map.Entry<String, Integer>> top5List = new ArrayList<>(top5);
        Collections.reverse(top5List);
        result.put("重复次数最多的5个IP", top5List);
        return (HashMap) result;

    }


}
